package tour.board.controller;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import tour.board.service.BoardService;
import tour.board.service.CmBoardService;
import tour.board.service.EpBoardService;
import tour.board.to.Board;
import tour.board.to.CmBoard;
import tour.board.to.EpBoard;


@Controller
@RequestMapping("/board")
public class BoardController {
	
	@Autowired
	private BoardService boardService;
	
	@Autowired
	private EpBoardService epboard;
	
	@Autowired
	private CmBoardService cmboard;
	
	@RequestMapping("/index.do")
	public String index(ModelMap model) throws Exception{
		ArrayList list = boardService.mainList();
		ArrayList list1 = epboard.mainList();
		ArrayList list2 = cmboard.mainList();
		System.out.println(list2);
		model.addAttribute("boardList", list);
		model.addAttribute("epboardList",list1);
		model.addAttribute("cmboardList",list2);
		return "/main.jsp";
	}
	
	
	public void setBoardService(BoardService boardService) {
		this.boardService = boardService;
	}
	
	/**
	 * 새글 입력 폼 이동 처리 handler메소드
	 * @return String url
	 */
	@RequestMapping("/write_form.do")
	public String writeForm(){
		return "write_form.jsp";
	}

	/**
	 * 새글 등록 처리 handler 메소드
	 * @param board : Board -  client가 전송한 새글 정보 - writer, title, content 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("/writeContent.do")
	public ModelAndView writeContent(Board board){
		ModelAndView mv = null;
		//2. Business Logic - Model(Business Service)로 요청
		try {
			boardService.writeContent(board);
			mv = new ModelAndView("redirect:getContent.do?no="+board.getNo());
		} catch (SQLException e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp", "error_message", "글등록 중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	/**
	 * 글 목록 조회 처리 handler 메소드
	 * @param page String - 보고자 하는 list 페이지 번호
	 * @param model ModelMap - list.jsp(목록페이지) 로 전송할 값을 저장할 객체
	 * @return String - list.jsp로 이동 처리
	 * @throws Exception
	 */
	@RequestMapping("/list.do")
	public String list(@RequestParam(required=false, defaultValue="1")String page, ModelMap model) throws Exception{
		
		String url = null;
		//2. Business Logic 호출 ->model		
		try {
			//page=  로 넘어온 경우(위 @RequestParam 설정은 page 요청파라미터 이름으로 넘어온 것이 없는 경우이다.
			if(page.equals("")){
				page="1";
			}
			int pageNo = Integer.parseInt(page);
			Map map = boardService.getBoardListByPage(pageNo);
			model.addAllAttributes(map);
			url = "list.jsp";
			
		} catch (SQLException e) {
			e.printStackTrace();
			url = "error.jsp";
			model.addAttribute("error_message", "글목록 조회도중 오류 발생 : "+e.getMessage());
		}
		return url;
	}
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no int - 조회하고자 하는 글번호
	 * @param map ModelMap - 조회한 글 데이터를 저장할 ModelMap
	 * @return String - show_content.jsp 로 이동
	 */
	@RequestMapping("/getContent.do")
	public String getContent(int no, ModelMap map){
		String url = null;
		try{
			//2. Business Logic 요청 - Model
			Board board = boardService.getContentByNO(no);
			map.addAttribute("board", board);
			url = "show_content.jsp"; 
		}catch(Exception e){
			e.printStackTrace();
			map.addAttribute("error_message", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "error.jsp";
		}	
		return url;
	}
	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * @param no : int - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param map : 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return String :  정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("/modifyForm.do")
	public String modifyForm(int no, ModelMap map){
		String url = null;
		try{
			//2. B.L 처리
			Board board = boardService.getContentByNoForForm(no);
			url = "modify_form.jsp";
			map.addAttribute("board", board);
		}catch(Exception e){
			e.printStackTrace();
			url = "error.jsp";
			map.addAttribute("error_message", "수정할 글 조회도중 오류발생 : "+e.getMessage());
		}
		return url;
	}
	/**
	 * 클라이언트가 수정한 글을 처리하기 위한 Handler 메소드
	 * 
	 * @param board : Board -  client가 전송한 게시물 수정 정보 - no, writer, title, content, viewcount, page번호 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상
	 */
	@RequestMapping("/modifyContent.do")
	public ModelAndView modifyContent(Board board) {
		ModelAndView mv = null;
		try {			
			//2. B.L 요청
			boardService.modifyContent(board);
			mv = new ModelAndView("redirect:getContent.do?no="+board.getNo());
		} catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp","error_message", "수정처리중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 글 삭제 처리 handler 메소드
	 * @param no : int - 삭제할 글 번호
	 * @return ModelAndView - 정상흐름 : list.do (목록으로 이동), 예외흐름 : error.jsp
	 */
	@RequestMapping("/deleteContent.do")
	public ModelAndView deleteContent(int no){
		ModelAndView mv = null;
		try {
			//2. BL
			boardService.deleteContentByNO(no);
			mv = new ModelAndView("list.do");
			//mv = list(request, response);
		}catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("/error.jsp","error_message", "삭제도중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 답변 입력 폼 으로 이동을 처리하는 handler 메소드
	 * @param no : int - 답변하고자 하는 원본글의 번호. 답변 폼으로 원본글의 데이터를 보낸다.
	 * @return
	 */
	@RequestMapping("/replyForm.do")
	public String replyForm(int no, ModelMap map){
		String url = null;
		try {
			//1. 요청 파라미터 조회 - no
			Board board = boardService.getContentByNoForForm(no);
			url = "reply_form.jsp";
			map.addAttribute("board", board);
		}catch (SQLException e) {
			e.printStackTrace();
			url = "error.jsp.jsp";
			map.addAttribute("error_message", "답변할 원본글 조회도중 오류 발생 : "+e.getMessage());
		}
		return url;
	}
	/**
	 * 클라이언트가 전송한 답변 글을 등록하는 handler 메소드
	 * @param board : Board - client가 전송한 답변 게시물 정보 - writer, title, content, refamily, restep, relevel, page번호 가 요청파라미터로 전송됨
	 * @param page : 원본글이 위치했던 page (처리후 목록 페이지 이동시 원본글이 있던 페이지로 이동하기 위해)
	 * @return ModelAndView - 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("/replyContent.do")
	public ModelAndView replyContent(Board board,  @RequestParam(required=false, defaultValue="1") String page){
		ModelAndView mv = null;
		try{
			if(page.equals("")){
				page="1";
			}
			boardService.replyContent(board);
			//멱등처리
			mv = new ModelAndView("redirect:getContent.do?no="+board.getNo()+"&page="+page);
		}catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("/error.jsp", "error_message", "답변 처리 중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	@RequestMapping("/find.do")
	public String find(String finds,String find,ModelMap map){
		ArrayList list = boardService.findTitle(find);
		map.addAttribute("list",list);

		return "/board/list.jsp";
	}
}
